﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using FastFood.Business.Entities;
using FastFood.Business.Entities.Tipos;
using FastFood.Business.Logic;
using FastFood.Windows.Helpers;

namespace FastFood.Windows.Forms.Procesos
{
    public partial class CwfMovimientos : UserControl
    {
        private EstadoActual estadoActual;
        private readonly CwfInsumoBusqueda buscador = new CwfInsumoBusqueda();

        public CwfMovimientos()
        {
            InitializeComponent();
        }

        private void CwfMovimientos_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                this.TsMenu.FormularioID = Convert.ToByte(this.Tag);
                this.TsMenu.LoadPermisos();
                LoadMotivos();
                ClearControls();
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);

                this.buscador.BorderStyle = BorderStyle.None;
                this.buscador.CwfInsumoBusqueda_SeleccionEntidad += new GetObjeto(CwfInsumoBusqueda_SeleccionEntidad);
                this.cmbInsumo.DropDownControl = buscador;
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsMenu_EventoNuevo(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            this.cmbMovimiento.Enabled = true;
            this.cmbInsumo.Enabled = true;
            this.cmbInsumo.Focus();
            this.movimientosBindingSource.AddNew();
        }

        private void TsMenu_EventoEditar(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.cmbMovimiento.Enabled = false;
            this.cmbInsumo.Enabled = false;
            this.cmbLotes.Focus();
        }

        private void TsMenu_EventoEliminar(object sender, EventArgs e)
        {
            if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
                if (this.movimientosBindingSource.Current != null)
                {
                    LoadMovimiento(this.movimientosBindingSource.Current as Movimientos);
                }
            }
        }

        private void TsMenu_EventoGuardar(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    if (this.movimientosBindingSource.Current != null)
                    {
                        LoadMovimiento(this.movimientosBindingSource.Current as Movimientos);
                    }
                    EnabledControls(true);
                    EnabledButtons(true);
                    this.movimientosDataGridView.Focus();
                }
            }
        }

        private void TsMenu_EventoCancelar(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo)
            {
                ClearControls();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.movimientosBindingSource.CancelEdit();
            this.movimientosDataGridView.Focus();
        }

        private void cmbMovimiento_SelectedIndexChanged(object sender, EventArgs e)
        {
            var movimiento = (MotivoMovimiento)Enum.Parse(typeof(MotivoMovimiento), (cmbMovimiento.SelectedIndex + 5).ToString());
            lblCodigo.CargarCodigo(movimiento, 0);
        }

        private void cmbLotes_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadAlmacenes();
        }

        private void cmbAlmacenes_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbLotes.SelectedValue == null || cmbAlmacenes.SelectedValue == null) return;
            var almacenamiento = AlmacenamientosManager.Instancia.Obtener(Convert.ToInt32(cmbLotes.SelectedValue), Convert.ToInt16(cmbAlmacenes.SelectedValue));
            lblStockActual.Text = almacenamiento.stock.ToString();
        }

        private void movimientosDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadMovimiento(this.movimientosBindingSource.Current as Movimientos);
            }
        }

        private void CwfInsumoBusqueda_SeleccionEntidad(object objeto)
        {
            var insumo = (Insumos)objeto;
            cmbInsumo.Text = insumo.nombre;
            cmbInsumo.Tag = insumo.insumoID;
            LoadLotes();
            cmbLotes.Focus();
            cmbInsumo.HideDropDown();
            LoadAlmacenes();
        }

        private void cmbInsumo_DropDown(object sender, EventArgs e)
        {
            buscador.limpiar();
            cmbInsumo.Text = "[Seleccionar un Inusmo/Producto]";
        }

        private void cmbInsumo_DropDownClosed(object sender, EventArgs e)
        {

        }

        private void cmbInsumo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down)
                cmbInsumo.ShowDropDown();
            else
                e.SuppressKeyPress = true;
        }

        private void cmbMovimientoFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                var motivo = cmbMovimientoFiltro.SelectedIndex + 5;
                var movimientos = MovimientosManager.Instancia.ListarPorMotivo((byte)motivo);
                movimientosBindingSource.DataSource = new List<Movimientos>(movimientos);
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void InitialLoad()
        {
            try
            {
                cmbMovimiento.SelectedIndex = 0;
                var movimientos = MovimientosManager.Instancia.ListarPropios();
                movimientosBindingSource.DataSource = new List<Movimientos>(movimientos);
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void LoadMotivos()
        {
            cmbMovimiento.Items.Add("Salida por Control de Calidad");
            cmbMovimiento.Items.Add("Bajas por Obsolescencia (expiración)");
            cmbMovimiento.Items.Add("Ingreso por Ajuste de Inventario");
            cmbMovimiento.Items.Add("Salida por Ajuste de Inventario");

            cmbMovimientoFiltro.Items.Add("Salida por Control de Calidad");
            cmbMovimientoFiltro.Items.Add("Bajas por Obsolescencia (expiración)");
            cmbMovimientoFiltro.Items.Add("Ingreso por Ajuste de Inventario");
            cmbMovimientoFiltro.Items.Add("Salida por Ajuste de Inventario");
        }

        private void LoadMovimiento(Movimientos movimiento)
        {
            lblMovimientoID.Text = movimiento.movimientoID.ToString();
            var motivo = (MotivoMovimiento)Enum.Parse(typeof(MotivoMovimiento), movimiento.motivo.ToString());
            cmbMovimiento.SelectedIndex = movimiento.motivo - 5;
            lblCodigo.CargarCodigo(motivo, movimiento.operacionID.Value);
            cmbInsumo.Text = movimiento.nombreInsumo;
            cmbInsumo.Tag = movimiento.insumoID;
            LoadLotes();
            cmbLotes.SelectedValue = movimiento.loteID;
            LoadAlmacenes();
            cmbAlmacenes.SelectedValue = movimiento.almacenID;
            txtCantidad.Text = (movimiento.cantidad < 0 ? (-1 * movimiento.cantidad) : movimiento.cantidad).ToString();
        }

        private void LoadLotes()
        {
            short insumoID = Convert.ToInt16(cmbInsumo.Tag);
            if (insumoID > 0)
            {
                try
                {
                    cmbLotes.DisplayMember = "Resumen";
                    cmbLotes.ValueMember = "loteID";
                    cmbLotes.DataSource = LotesManager.Instancia.ListarByInsumoID(insumoID);
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
            }
            else
            {
                cmbLotes.DataSource = null;
            }
        }

        private void LoadAlmacenes()
        {
            int loteID = 0;
            if (cmbLotes.SelectedValue != null) Int32.TryParse(cmbLotes.SelectedValue.ToString(), out loteID);
            if (loteID > 0)
            {
                try
                {
                    cmbAlmacenes.DisplayMember = "Almacen_Nombre";
                    cmbAlmacenes.ValueMember = "almacenID";
                    cmbAlmacenes.DataSource = AlmacenamientosManager.Instancia.ListarPorLoteID(loteID);
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
            }
            else
            {
                cmbAlmacenes.DataSource = null;
            }
        }

        private bool SaveData()
        {
            bool result = false;
            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        MovimientosManager.Instancia.Agregar(ObtenerMovimiento());
                        break;
                    case EstadoActual.Editar:
                        MovimientosManager.Instancia.Modificar(ObtenerMovimiento());
                        break;
                    case EstadoActual.Eliminar:
                        MovimientosManager.Instancia.Eliminar(ObtenerMovimiento());
                        this.movimientosBindingSource.RemoveCurrent();
                        break;
                }

                this.movimientosBindingSource.EndEdit();
                result = true;
                InitialLoad();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        private Movimientos ObtenerMovimiento()
        {
            return new Movimientos
            {
                movimientoID = Convert.ToInt32(lblMovimientoID.Text),
                motivo = (byte)(cmbMovimiento.SelectedIndex + 5),
                insumoID = Convert.ToInt32(cmbInsumo.Tag),
                loteID = Convert.ToInt32(cmbLotes.SelectedValue),
                almacenID = Convert.ToInt16(cmbAlmacenes.SelectedValue),
                cantidad = Convert.ToDouble(txtCantidad.Text),
                fecha = DateTime.Now,
                personalID = DatosGenerales.PersonalActual.personalID
            };
        }

        private bool ValidateData()
        {
            bool result = true;

            if (cmbInsumo.Tag == null)
            {
                this.errValidator.SetError(this.cmbInsumo, "Seleccionar un Insumo/Producto.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbInsumo, string.Empty);
            }
            if (cmbLotes.SelectedIndex < 0)
            {
                this.errValidator.SetError(this.cmbLotes, "Seleccionar un Lote.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbLotes, string.Empty);
            }
            if (cmbAlmacenes.SelectedIndex < 0)
            {
                this.errValidator.SetError(this.cmbAlmacenes, "Seleccionar un Almacen.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbAlmacenes, string.Empty);
            }
            if (string.IsNullOrEmpty(this.txtCantidad.Text))
            {
                this.errValidator.SetError(this.txtCantidad, "Ingresar Cantidad.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtCantidad, string.Empty);
            }
            return result;
        }

        private void ClearControls()
        {
            lblMovimientoID.Text = "0";
            cmbMovimiento.SelectedIndex = 0;
            lblCodigo.CargarCodigo(MotivoMovimiento.ControlCalidad, 0);
            cmbInsumo.Text = "[Seleccionar un Insumo/Producto]";
            cmbLotes.SelectedIndex = -1;
            cmbLotes.DataSource = null;
            cmbAlmacenes.SelectedIndex = -1;
            cmbAlmacenes.DataSource = null;
            txtCantidad.Clear();
            lblStockActual.Text = "0.00";
            errValidator.Clear();
        }

        private void EnabledButtons(bool valor)
        {
            this.TsMenu.EnabledNuevo = valor;
            this.TsMenu.EnabledEditar = valor;
            this.TsMenu.EnabledEliminar = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsMenu.EnabledGuardar = true;
                this.TsMenu.EnabledCancelar = true;
                this.movimientosDataGridView.Enabled = false;
            }
            else
            {
                this.TsMenu.EnabledGuardar = false;
                this.TsMenu.EnabledCancelar = false;
                this.movimientosDataGridView.Enabled = true;
            }
        }

        private void EnabledControls(bool valor)
        {
            this.gbxInformacion.Enabled = !valor;
            this.movimientosDataGridView.Enabled = valor;
        }
    }
}
